{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building a system (globular protein and ligand)\n",
    "\n",
    "by Stefan Doerr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This tutorial shows how to automatically build a system using the HTMD code. In this example, a system comprised of a globular protein (trypsin) and its inhibitor (benzamidine) is prepared for ligand binding simulations using ACEMD (Buch et al. 2011 PNAS 108(25) 10184-89). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Working files\n",
    "\n",
    "To generate a system ready for simulation, HTMD needs the topology, parameters and coordinates (i.e. PDB file or PDB code of the protein) of all elements in the simulations.\n",
    "\n",
    "Download all tutorial files from the following [link](http://docs.htmd.org/download/building_files.zip). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Getting started\n",
    "\n",
    "First we import the modules we are going to need for the tutorial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "HTMD. 26-27 November 2015 HTMD workshop in Barcelona (fully booked)\n",
      "\n",
      "You are on the latest HTMD version (unpackaged).\n",
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: pylab import has clobbered these variables: ['random']\n",
      "`%matplotlib` prevents importing * from pylab and numpy\n"
     ]
    }
   ],
   "source": [
    "from htmd import *\n",
    "import numpy as np\n",
    "import os\n",
    "%pylab inline\n",
    "matplotlib.rcParams.update({'font.size': 12})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Clean and split PDB\n",
    "\n",
    "In this example, the structure is retrieved from the PDB database and saved in the working directory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "prot = Molecule('3PTB')\n",
    "prot.write('/tmp/protein.pdb', sel='chain A and protein and noh')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Extract only chain A from the PDB file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "prot.filter('chain A and (protein or water or resname CA)')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define segments\n",
    "\n",
    "Crystallized water molecules and one calcium ion present in the crystal structure are also obtained from this PDB."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "prot.set('segid', 'P', sel='protein and noh')\n",
    "prot.set('segid', 'W', sel='water')\n",
    "prot.set('segid', 'CA', sel='resname CA')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Center the system to the origin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "prot.center()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "and calculate the radius of the protein"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from moleculekit.util import maxDistance, uniformRandomRotation\n",
    "D = maxDistance(prot, 'all')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load the ligand and merge molecules"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load up the ligand, calculate its geometric center and randomly rotate it around itself"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "tutfiles = home() + '/data/building-protein-ligand/'\n",
    "ligand = Molecule(tutfiles + 'benzamidine.pdb')\n",
    "ligand.center()\n",
    "ligand.rotateBy(uniformRandomRotation())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now place the ligand randomly around the protein at the distance defined above"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ligand.moveBy([D+10, 0, 0])  # Move the ligand 10 Angstrom away from the furthest protein atom in X dimension\n",
    "ligand.rotateBy(uniformRandomRotation())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Set resname and segid of the ligand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ligand.set('resname','MOL')\n",
    "ligand.set('segid','L')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Join all"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "all = Molecule()\n",
    "all.append(prot)\n",
    "all.append(ligand)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Solvate the system\n",
    "\n",
    "Define the size of the solvation box and solvate the system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2015-11-23 18:44:22,004 - htmd.builder.solvate - INFO - Using water pdb file at: /shared/sdoerr/Work/pyHTMD/htmd/builder/wat.pdb\n",
      "2015-11-23 18:44:22,626 - htmd.builder.solvate - INFO - Replicating 8 water segments, 2 by 2 by 2\n",
      "Solvating: 100% (8/8) [############################################] eta 00:01 /\n"
     ]
    }
   ],
   "source": [
    "D = D + 15\n",
    "allsol = solvate(all, minmax=[[-D, -D, -D], [D, D, D]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Building the system for CHARMM\n",
    "\n",
    "Check for the available charmm parameter and topology files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---- Topologies files list: /shared/sdoerr/Work/pyHTMD/htmd/builder/charmmfiles/top/ ----\n",
      "top/top_all22star_prot.rtf\n",
      "top/top_all36_carb.rtf\n",
      "top/top_all36_lipid.rtf\n",
      "top/top_all36_prot.rtf\n",
      "top/top_water_ions.rtf\n",
      "top/top_all36_cgenff.rtf\n",
      "top/top_all36_na.rtf\n",
      "---- Parameters files list: /shared/sdoerr/Work/pyHTMD/htmd/builder/charmmfiles/par/ ----\n",
      "par/par_all22star_prot.prm\n",
      "par/par_all36_carb.prm\n",
      "par/par_all36_lipid.prm\n",
      "par/par_all36_prot.prm\n",
      "par/par_all36_cgenff.prm\n",
      "par/par_all36_na.prm\n",
      "par/par_water_ions.prm\n"
     ]
    }
   ],
   "source": [
    "charmm.listFiles()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Indicate the location of the CHARMM topology and parameter files as well are your own custom parameter and topology files. The CHARMM files can be included without their full path, using just the name indicated in the previous list command. Then we build the system for CHARMM."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2015-11-23 18:44:40,576 - htmd.builder.charmm - INFO - Writing out segments.\n",
      "Bond between A: [serial 48 resid 22 resname CYS chain A segid P]\n",
      "             B: [serial 1007 resid 157 resname CYS chain A segid P]\n",
      "\n",
      "Bond between A: [serial 185 resid 42 resname CYS chain A segid P]\n",
      "             B: [serial 298 resid 58 resname CYS chain A segid P]\n",
      "\n",
      "Bond between A: [serial 811 resid 128 resname CYS chain A segid P]\n",
      "             B: [serial 1521 resid 232 resname CYS chain A segid P]\n",
      "\n",
      "Bond between A: [serial 853 resid 136 resname CYS chain A segid P]\n",
      "             B: [serial 1327 resid 201 resname CYS chain A segid P]\n",
      "\n",
      "Bond between A: [serial 1084 resid 168 resname CYS chain A segid P]\n",
      "             B: [serial 1190 resid 182 resname CYS chain A segid P]\n",
      "\n",
      "Bond between A: [serial 1265 resid 191 resname CYS chain A segid P]\n",
      "             B: [serial 1422 resid 220 resname CYS chain A segid P]\n",
      "\n",
      "2015-11-23 18:45:12,563 - htmd.builder.builder - INFO - 6 disulfide bonds were added\n",
      "2015-11-23 18:45:12,759 - htmd.builder.charmm - INFO - Starting the build.\n",
      "2015-11-23 18:45:14,687 - htmd.builder.charmm - INFO - Finished building.\n",
      "2015-11-23 18:45:15,869 - htmd.builder.ionize - INFO - Adding 9 anions + 0 cations for neutralizing and 108 ions for the given salt concentration.\n",
      "2015-11-23 18:45:16,182 - htmd.builder.ionize - INFO - Min distance of ions from molecule: 5A\n",
      "2015-11-23 18:45:16,183 - htmd.builder.ionize - INFO - Min distance between ions: 5A\n",
      "2015-11-23 18:45:16,183 - htmd.builder.ionize - INFO - Placing 117 ions.\n",
      "2015-11-23 18:46:25,468 - htmd.builder.charmm - INFO - Writing out segments.\n",
      "2015-11-23 18:46:37,921 - htmd.builder.charmm - INFO - Starting the build.\n",
      "2015-11-23 18:46:39,717 - htmd.builder.charmm - INFO - Finished building.\n"
     ]
    }
   ],
   "source": [
    "topos  = ['top/top_all22star_prot.rtf', 'top/top_water_ions.rtf', tutfiles + 'benzamidine.rtf']\n",
    "params = ['par/par_all22star_prot.prm', 'par/par_water_ions.prm', tutfiles + 'benzamidine.prm']\n",
    "\n",
    "molbuilt = charmm.build(allsol, topo=topos, param=params, outdir='/tmp/build', saltconc=0.15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note regarding ions: the build command will by default just try to neutralize the system. To add a specific salt concentration the option `saltconc` needs to be used. In the previous command, a 150mM NaCl salt concentration was used."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualize the built system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "molbuilt.view(sel='water',style='Lines',hold=True)\n",
    "molbuilt.view(sel='resname MOL',style='Licorice',hold=True)\n",
    "molbuilt.view(sel='ions',style='VDW',hold=True)\n",
    "molbuilt.view(sel='protein',style='NewCartoon',color='Secondary Structure')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Building the system for AMBER\n",
    "\n",
    "Check for available AMBER forcefield files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---- Forcefield files list: /shared/lab/software/AmberTools14/amber14/dat/leap/cmd/ ----\n",
      "leaprc.phosaa10\n",
      "leaprc.GLYCAM_06j-1\n",
      "leaprc.ff14ipq\n",
      "leaprc.lipid11\n",
      "leaprc.gaff\n",
      "leaprc.lipid14\n",
      "leaprc.modrna08\n",
      "leaprc.GLYCAM_06EPb\n",
      "leaprc.ff12SB\n",
      "leaprc.ff03.r1\n",
      "leaprc.constph\n",
      "leaprc.ff14SBonlysc\n",
      "leaprc.ff03ua\n",
      "leaprc.ffAM1\n",
      "leaprc.ffPM3\n",
      "leaprc.ff14SB\n"
     ]
    }
   ],
   "source": [
    "amber.listFiles()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Indicate the desired forcefield files and build the system for AMBER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ffs = ['leaprc.lipid14', 'leaprc.ff14SB', 'leaprc.gaff']  # Missing the parameters for Benzamidine in AMBER\n",
    "\n",
    "#molbuilt = amber.build(allsol, ff=ffs, outdir='/tmp/build', saltconc=0.15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualize the built system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "molbuilt.view()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Before building your system (preliminary considerations)\n",
    "\n",
    "The PDB format is very old. In an effort to handle its legacy shortcomings, several versions have been made over the years, they are not all readily interchangeable, and not all software can handle each version perfectly. The most important things to watch out for are: * Columns: the PDB format has very rigid rules about what values can go in each space. Keep in mind that it is not a space/tab/comma delimited format, but rather has rigid definitions of what should be in each space/column. * The PDB format as originally designed cannot handle more than 9,999 resids or 99,999 atoms (due to the column format issue). Several workarounds have been devised, such as using hexadecimal numbers or other compact number formats. VMD has no trouble saving more atoms/residues.\n",
    "\n",
    "In addition, one needs to know well the working system, thus: * Always review your PDB file: inspect the REMARK sections of the PDB file. You can often find keyspecific information regarding the structure (e.g. disulfide bridges, mising atoms, etc.). \n",
    "\n",
    "* Protonation/pH: the protonation state of the system is critical. Since molecular dynamics simulations typically don't allow for bond breaking, the initial protonation of the system must be accurate. Knowing what pH you are trying to reproduce is therefore important to obtain the correct results. If you suspect changing protonation is important to your system and you still want to use classical mechanics, consider simulating both states (protonated and not protonated). Histidine residues can have three different protonations states even at pH 7, therefore, a correct protonation of this residue is particularly critical. This residue can be protonated at either delta (most common), epsilon (very common also) or at both nitrogens (special situations and low pH).\n",
    "\n",
    "<img src=\"http://docs.htmd.org/img/histidines.png\">\n",
    "\n",
    "The best way to determine how histidine should be protonated is to look at the the structure. Typically, a histidine residue is protonated if it is close enough to an electron donor (e.g. a glutamic acid), thus creating a hydrogen bond. Certain automated tools predict the protonation state of histidines based on their surrounding environment (e.g. Autodock tools). Since histidines are frequently present at protein active sites, a correct protonation state is particularly important in ligand binding simulations.\n",
    "\n",
    "* Disulfide bonds present in the system must be identified. As shown below, this is automatically done by htmd\n",
    "* Metalloproteins: if the metal ion is not an active part of an interaction it may be acceptable to just allow it to act as a cation perhaps restraining it with some harmonic constraints if neccesary.\n",
    "* Duplicate atoms in the PDB file: typically simply delete one of the duplicated groups. However, if both conformations are potentially important (e.g. such loops involved in molecular recognition) it might be necessary to simulate both conformations separately.\n",
    "\n",
    "## List of common patches\n",
    "\n",
    "C-terminal patches:\n",
    "\n",
    "<table class=\"summarytable\">\n",
    "    <thead>\n",
    "        <tr>\n",
    "            <th>Name</th>\n",
    "            <th>Class</th>\n",
    "            <th>Description</th>\n",
    "        </tr>\n",
    "    </thead>\n",
    "    <tbody>\n",
    "        <tr>\n",
    "            <td>CTER</td>\n",
    "            <td>-1.00</td>\n",
    "            <td>standard C-terminus</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>CT1</td>\n",
    "            <td>0.00</td>\n",
    "            <td>methylated C-terminus from methyl acetate</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>CT2</td>\n",
    "            <td>0.00</td>\n",
    "            <td>amidated C-terminus</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>CT3</td>\n",
    "            <td>0.00</td>\n",
    "            <td>N-Methylamide C-terminus</td>\n",
    "        </tr>\n",
    "    </tbody>\n",
    "</table>\n",
    "\n",
    "N-terminal patches:\n",
    "<table class=\"summarytable\">\n",
    "    <thead>\n",
    "        <tr>\n",
    "            <th>Name</th>\n",
    "            <th>Class</th>\n",
    "            <th>Description</th>\n",
    "        </tr>\n",
    "    </thead>\n",
    "    <tbody>\n",
    "        <tr>\n",
    "            <td>NTER</td>\n",
    "            <td>1.00</td>\n",
    "            <td>standard N-terminus</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>ACE</td>\n",
    "            <td>0.00</td>\n",
    "            <td>acetylated N-terminus (to create dipeptide)</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>ACP</td>\n",
    "            <td>0.00</td>\n",
    "            <td>acetylated N-terminus (for proline dipeptide)</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>PROP</td>\n",
    "            <td>1.00</td>\n",
    "            <td>Proline N-Terminal</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>GLYP</td>\n",
    "            <td>1.00</td>\n",
    "            <td>Glycine N-terminus </td>\n",
    "        </tr>\n",
    "    </tbody>\n",
    "</table>\n",
    "\n",
    "Side chain patches:\n",
    "\n",
    "<table class=\"summarytable\">\n",
    "    <thead>\n",
    "        <tr>\n",
    "            <th>Name</th>\n",
    "            <th>Class</th>\n",
    "            <th>Description</th>\n",
    "        </tr>\n",
    "    </thead>\n",
    "    <tbody>\n",
    "        <tr>\n",
    "            <td>ASPP</td>\n",
    "            <td>0.00</td>\n",
    "            <td>patch for protonated aspartic acid, proton on od2</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>GLUP</td>\n",
    "            <td>0.00</td>\n",
    "            <td>patch for protonated glutamic acid, proton on oe2</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>CYSD</td>\n",
    "            <td>-1.0</td>\n",
    "            <td>patch for deprotonated CYS</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>DISU</td>\n",
    "            <td>-0.36</td>\n",
    "            <td>patch for disulfides. Patch must be 1-CYS and 2-CYS</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>HS2</td>\n",
    "            <td>0.00</td>\n",
    "            <td>Patch for neutral His, move proton from ND1 to NE2</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TP1</td>\n",
    "            <td>-1.00</td>\n",
    "            <td>convert tyrosine to monoanionic phosphotyrosine</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TP1A</td>\n",
    "            <td>-1.00</td>\n",
    "            <td>patch to convert tyrosine to monoanionic phenol-phosphate model\n",
    "            compound when generating tyr, use first none last none for terminal\n",
    "            patches</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TP2</td>\n",
    "            <td>-2.00</td>\n",
    "            <td>patch to convert tyrosine to dianionic phosphotyrosine</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TP2A</td>\n",
    "            <td>-2.00</td>\n",
    "            <td>patch to convert tyrosine to dianionic phosphotyrosine when\n",
    "            generating tyr, use first none last none for terminal patches this\n",
    "            converts a single tyrosine to a phenol phosphate</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TMP1</td>\n",
    "            <td>-1.00</td>\n",
    "            <td>patch to convert tyrosine to monoanionic phosphonate ester O -&gt;\n",
    "            methylene (see RESI BMPH)</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TMP2</td>\n",
    "            <td>-2.00</td>\n",
    "            <td>patch to convert tyrosine to dianionic phosphonate ester O -&gt;\n",
    "            methylene (see RESI BMPD)</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>TDF1</td>\n",
    "            <td>-1.00</td>\n",
    "            <td>patch to convert tyrosine to monoanionic difluoro phosphonate ester\n",
    "            O -&gt;  methylene (see RESI BDFH)</td>\n",
    "        </tr>\n",
    "    </tbody>\n",
    "</table>\n",
    "\n",
    "Circular protein chain patches:\n",
    "\n",
    "<table class=\"summarytable\">\n",
    "    <thead>\n",
    "        <tr>\n",
    "            <th>Name</th>\n",
    "            <th>Class</th>\n",
    "            <th>Description</th>\n",
    "        </tr>\n",
    "    </thead>\n",
    "    <tbody>\n",
    "        <tr>\n",
    "            <td>LIG1</td>\n",
    "            <td>0.00000</td>\n",
    "            <td>linkage for cyclic peptide, 1 refers to the C terminus which is a\n",
    "            glycine , 2 refers to the N terminus</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>LIG2</td>\n",
    "            <td>0.00000</td>\n",
    "            <td>linkage for cyclic peptide, 1 refers to the C terminus, 2 refers to\n",
    "            the N terminus which is a glycine</td>\n",
    "        </tr>\n",
    "        <tr>\n",
    "            <td>LIG3</td>\n",
    "            <td>0.00000</td>\n",
    "            <td>linkage for cyclic peptide, 1 refers to the C terminus which is a\n",
    "            glycine, 2 refers to the N terminus which is a glycine</td>\n",
    "        </tr>\n",
    "    </tbody>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.4.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
